#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Module文件扫描器
扫描项目中的所有Module配置文件
"""

import os
import fnmatch
import logging
from pathlib import Path
from typing import List

class ModuleScanner:
    """Module文件扫描器"""
    
    def __init__(self, module_filename='Module'):
        """
        初始化扫描器
        
        Args:
            module_filename: Module文件名，默认为'Module'
        """
        self.module_filename = module_filename
        self.exclude_dirs = {
            '.git', '.svn', '.hg',
            '__pycache__', '.pytest_cache',
            'build', 'dist', 'out',
            '.vscode', '.idea',
            'node_modules'
        }
    
    def scan_modules(self, root_dir: str) -> List[str]:
        """
        扫描指定目录下的所有Module文件
        
        Args:
            root_dir: 根目录路径
            
        Returns:
            Module文件路径列表
        """
        module_files = []
        root_path = Path(root_dir).resolve()
        
        for root, dirs, files in os.walk(root_path):
            # 过滤排除的目录
            dirs[:] = [d for d in dirs if d not in self.exclude_dirs]
            
            # 查找Module文件
            for filename in files:
                if filename == self.module_filename:
                    module_path = os.path.join(root, filename)
                    module_files.append(module_path)
        
        return sorted(module_files)
    
    def scan_modules_pattern(self, root_dir: str, pattern: str = 'Module*') -> List[str]:
        """
        使用模式匹配扫描Module文件
        
        Args:
            root_dir: 根目录路径
            pattern: 文件名模式
            
        Returns:
            Module文件路径列表
        """
        module_files = []
        root_path = Path(root_dir).resolve()
        
        for root, dirs, files in os.walk(root_path):
            # 过滤排除的目录
            dirs[:] = [d for d in dirs if d not in self.exclude_dirs]
            
            # 使用模式匹配查找文件
            for filename in files:
                if fnmatch.fnmatch(filename, pattern):
                    module_path = os.path.join(root, filename)
                    module_files.append(module_path)
        
        return sorted(module_files)
    
    def validate_module_file(self, module_path: str) -> bool:
        """
        验证Module文件是否有效
        
        Args:
            module_path: Module文件路径
            
        Returns:
            是否有效
        """
        try:
            with open(module_path, 'r', encoding='utf-8') as f:
                content = f.read()
            
            # 简单的语法检查
            compile(content, module_path, 'exec')
            return True
            
        except Exception as e:
            logging.error(f"Module文件验证失败 {module_path}: {e}")
            return False
    
    def get_module_info(self, module_path: str) -> dict:
        """
        获取Module文件信息
        
        Args:
            module_path: Module文件路径
            
        Returns:
            Module信息字典
        """
        info = {
            'path': module_path,
            'dir': os.path.dirname(module_path),
            'name': os.path.basename(os.path.dirname(module_path)),
            'valid': self.validate_module_file(module_path)
        }
        
        return info